<?php
declare (strict_types=1);

namespace app\admin\validate\dev;

use think\Validate;
use app\admin\model\dev\Api as ApiModel;

class Api extends Validate
{
    /**
     * 定义验证规则
     * 格式：'字段名' =>  ['规则1','规则2'...]
     *
     * @var array
     */
    protected $rule = [
        'name' => 'require|checkUniqueWithSoftDelete:name',
        'controller' => 'require|checkUniqueWithSoftDelete:controller',
    ];

    /**
     * 定义错误信息
     * 格式：'字段名.规则名' =>  '错误信息'
     *
     * @var array
     */
    protected $message = [
        'name.checkUniqueWithSoftDelete' => '菜单名已存在！',
        'controller.checkUniqueWithSoftDelete' => '控制器已存在！',
    ];

    // 定义场景：新增和更新操作
    protected $scene = [
        'index' => ['*'],
        'add' => ['name', 'controller',],
        'edit' => ['name', 'controller',],
    ];

    /**
     * 自定义验证方法：检查菜单名称唯一性（排除软删除数据）
     * @param $value
     * @param $ruleField
     * @param $data
     * @param $field
     * @return bool
     */
    protected function checkUniqueWithSoftDelete($value, $ruleField, $data, $field): bool
    {
        try {
            // 当为更新操作且存在ID时，检查字段是否被修改
            if (!empty($data['id'])) {
                $originalData = ApiModel::where('id', $data['id'])->find();
                // 若字段值未变化，则跳过唯一性校验
                if ($originalData && $originalData[$ruleField] == $value) {
                    return true;
                }
            }
            // 构建查询条件（排除软删除及当前记录）
            $query = ApiModel::where(function ($q) use ($ruleField, $value) {
                $q->whereNull('delete_time')->where($ruleField, '=', $value);
            });
            // 编辑时排除自身记录（需确保 $data['id'] 存在）
            if (array_key_exists('id', $data) && !empty($data['id'])) {
                $query->where('id', '<>', $data['id']);
            }
            // 仅检查 app='api'
            $query->where('app', '=', 'api');
            // trace($query->buildSql());
            return $query->count() === 0;
        } catch (\Exception $e) {
            return false;
        }
    }
}
